package com.uriuniv.validator;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.uriuniv.command.JoinCommand;
import com.uriuniv.domain.University;
import com.uriuniv.service.StudentS;
import com.uriuniv.service.UniversityS;

public class JoinV implements Validator {
	
	private UniversityS universityS;
	private StudentS studentS;
	
	public void setUniversityS(UniversityS universityS) {
		this.universityS = universityS;
	}
	public void setStudentS(StudentS studentS) {
		this.studentS = studentS;
	}

	private static final String EMAIL_REGEXP = "^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$";
	private static final String PASSWORD_REGEXP = "^[a-zA-Z0-9]*$";
	
	/**
	 * commandClass 확인
	 */
	public boolean supports(Class clazz) {
		if(JoinCommand.class.isAssignableFrom(clazz)){
			return true;
		}
		return false;
	}
	
	/**
	 * 유효성 검사
	 */
	public void validate(Object target, Errors errors) {
		JoinCommand joinCommand = (JoinCommand)target;
		
		validateName(errors, joinCommand.getName());
		validateEmail(errors, joinCommand.getEmail(), joinCommand.getEmailConfirm());
		validatePassword(errors, joinCommand.getPassword(), joinCommand.getPasswordConfirm());
		validateUniversity(errors, joinCommand.getUniversity());
	}
	
	/**
	 * 이름 유효성 검사
	 * @param errors
	 * @param studentName
	 */
	private void validateName(Errors errors, String name){
		int length = 0;
		
		if(name != null){
			length = name.length();
		}
		
		if(length < 2 || 12 < length){
			errors.rejectValue("name", "length", "이름/별명은 2~12자로 입력하세요.");
		}else if(studentS.getStudentByName(name) != null){
			errors.rejectValue("name", "exist", "이미 존재하는 이름/별명입니다.");
		}else{
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required", "이름/별명을 입력하세요.");
		}
	}
	
	/**
	 * 이메일 주소와 이메일 주소 다시 입력 유효성 검사
	 * @param errors
	 * @param email
	 * @param emailConfirm
	 */
	private void validateEmail(Errors errors, String email, String emailConfirm){
		
		Pattern pattern = Pattern.compile(EMAIL_REGEXP);
		Matcher matcher = pattern.matcher(email);
		
		if(!matcher.matches()){
			errors.rejectValue("email", "regex", "이메일 주소를 정확하게 입력해주세요.");
		}else if(studentS.getStudentByEmail(email) != null){
			errors.rejectValue("email", "exist", "이미 등록된 이메일 주소입니다.");
		}else{
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "required", "이메일 주소을 입력하세요.");
		}
		
		if(!email.equals(emailConfirm)){
			errors.rejectValue("emailConfirm", "equals", "이메일 주소와 다시 입력한 이메일 주소가 일치하지 않습니다.");
		}else{
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "emailConfirm", "required", "이메일 주소 다시 입력을 입력하세요.");
		}
		
	}
	
	/**
	 * 비밀번호 및 비밀번호 다시 입력 유효성 검사
	 * @param errors
	 * @param password
	 * @param passwordConfirm
	 */
	private void validatePassword(Errors errors, String password, String passwordConfirm){
		
		boolean bln = Pattern.matches(PASSWORD_REGEXP, password);
		int length = 0;
		
		if(password != null){
			length = password.length();
		}
		
		if(!bln){
			errors.rejectValue("password", "regex", "비밀번호는 숫자, 영어 조합만 가능합니다.");
		}else if(length < 6 || 15 < length){
			errors.rejectValue("password", "length", "비밀번호는 6~15자로 입력하세요.");
		}else{
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "required", "비밀번호을 입력하세요.");
		}
		
		if(!password.equals(passwordConfirm)){
			errors.rejectValue("passwordConfirm", "equals", "비밀번호와 다시 입력한 비밀번호가 일치하지 않습니다.");
		}else{
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "passwordConfirm", "required", "비밀번호 다시 입력을 입력하세요.");
		}
		
	}
	
	/**
	 * 학교이름 유효성 검사
	 * @param errors
	 * @param university
	 */
	private void validateUniversity(Errors errors, String university){
		University universityList = universityS.getUniversity(university);
		
		if(universityList == null){
			errors.rejectValue("university", "no", "해당 학교가 존재하지 않습니다.");	
		}else{
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "university", "required", "학교를 입력하세요.");
		}
		
	}
	
}
